package com.hanamaki.jdbc.until;

import com.hanamaki.oop.demo05.C;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

// Ctrl + Shift + `+`
/**
 * @author hanamaki
 * @version 1.0
 * @date 2021/7/1 13:39
 */
// 如果 工具类  类中的方法尽量使用静态方法
public class JDBC_C3P0_Util {

    static DataSource dataSource;
    static Connection connection;
    static PreparedStatement preparedStatement;
    static ResultSet resultSet;
    static ResultSetMetaData resultSetMetaData;

    /**
     * 读取数据库的配置
     */
    static{
        dataSource = new ComboPooledDataSource("MyDataSources");
    }

    /**
     * 连接数据库
     * @return
     * @throws SQLException
     */
    public static Connection getCon() throws SQLException {
        return dataSource.getConnection();
    }

    /**
     * 读取数据库中的文件 保存在  Object[][]二维数组中
     * @param tableName 需要查找数据的 表名
     * @return
     */
    public static Object[][] getSqlContent(String tableName) {
        Object[][] result = null;
        try {
            /*连接数据库*/
            connection = getCon();
            /*编写 sql 语句 tableName是表名*/
            String sql = "select * from " + tableName;
            /*预处理sql*/
            preparedStatement = connection.prepareStatement(sql);
            /*执行sql 得到结果集*/
            resultSet = preparedStatement.executeQuery();
            /*得到 数据库的表映射*/
            resultSetMetaData = resultSet.getMetaData();
            /*得到 表中 一共有多少列*/
            int columnCount = resultSetMetaData.getColumnCount();
            /*定义一个 集合 保存每一次 取出的 数据*/
            List<Object[]> data = new ArrayList<>();
            /*遍历结果集  一行一行的 遍历*/
            while (resultSet.next()) {/*如果数据表中 有下一行数据  就执行*/
                /*定义一个 一维数组  保存每一行 的 具体值*/
                String[] fields = new String[columnCount];
                /*遍历 列数 得到某一行中 的 具体数据*/
                for (int i = 0; i < columnCount; i++) {
                    fields[i] = resultSet.getString(i + 1);
                }
                data.add(fields);
            }

            /*现在结果存放在  集合中 要将 集合中的数据 转存 到二维数组中*/
            result = new Object[data.size()][];
            for (int i = 0; i < data.size(); i++) {
                result[i] = data.get(i);
            }

        } catch (Exception e) {
        } finally {
            refresh(connection, null, resultSet, preparedStatement);
        }

        return result;
    }

    /**
     * 释放数据库连接的资源
     * @param connection
     * @param statement
     * @param resultSet
     * @param preparedStatement
     */
    public static void refresh(Connection connection, Statement statement, ResultSet resultSet, PreparedStatement preparedStatement) {
        try {
            if (connection != null) {
                connection.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (resultSet != null) {
                resultSet.close();
            }
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
